From 5445b3d7eceef2b0c1a98f3bc5dbbaa51575ee27 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Mon, 5 Sep 2011 11:07:36 -0400 Subject: [PATCH] GtkToolbar: Move child removal to dispose Doing it in finalize is too late and can cause various problems in ::parent-set signal handlers. https://bugzilla.gnome.org/show_bug.cgi?id=658200 --- gtk/gtktoolbar.c | 70 +++++++++++++++++++++++++----------------------- 1 file changed, 37 insertions(+), 33 deletions(-) diff --git a/gtk/gtktoolbar.c b/gtk/gtktoolbar.c index b753f39f16..5692b60bd5 100644 --- a/gtk/gtktoolbar.c +++ b/gtk/gtktoolbar.c @@ -217,6 +217,7 @@ static void gtk_toolbar_get_child_property (GtkContainer *contain GValue *value, GParamSpec *pspec); static void gtk_toolbar_finalize (GObject *object); +static void gtk_toolbar_dispose (GObject *object); static void gtk_toolbar_show_all (GtkWidget *widget); static void gtk_toolbar_add (GtkContainer *container, GtkWidget *widget); @@ -371,6 +372,7 @@ gtk_toolbar_class_init (GtkToolbarClass *klass) gobject_class->set_property = gtk_toolbar_set_property; gobject_class->get_property = gtk_toolbar_get_property; gobject_class->finalize = gtk_toolbar_finalize; + gobject_class->dispose = gtk_toolbar_dispose; widget_class->button_press_event = gtk_toolbar_button_press; widget_class->draw = gtk_toolbar_draw; @@ -2535,34 +2537,34 @@ gtk_toolbar_remove (GtkContainer *container, static void gtk_toolbar_forall (GtkContainer *container, - gboolean include_internals, - GtkCallback callback, - gpointer callback_data) + gboolean include_internals, + GtkCallback callback, + gpointer callback_data) { GtkToolbar *toolbar = GTK_TOOLBAR (container); GtkToolbarPrivate *priv = toolbar->priv; GList *list; - + g_return_if_fail (callback != NULL); - + list = priv->content; while (list) { ToolbarContent *content = list->data; GList *next = list->next; - + if (include_internals || !toolbar_content_is_placeholder (content)) - { - GtkWidget *child = toolbar_content_get_widget (content); - - if (child) - callback (child, callback_data); - } - + { + GtkWidget *child = toolbar_content_get_widget (content); + + if (child) + callback (child, callback_data); + } + list = next; } - - if (include_internals) + + if (include_internals && priv->arrow_button) callback (priv->arrow_button, callback_data); } @@ -3129,39 +3131,41 @@ gtk_toolbar_get_drop_index (GtkToolbar *toolbar, } static void -gtk_toolbar_finalize (GObject *object) +gtk_toolbar_dispose (GObject *object) { - GList *list; GtkToolbar *toolbar = GTK_TOOLBAR (object); GtkToolbarPrivate *priv = toolbar->priv; if (priv->arrow_button) - gtk_widget_unparent (priv->arrow_button); - - if (priv->sibling_path != NULL) { - gtk_widget_path_unref (priv->sibling_path); - priv->sibling_path = NULL; + gtk_widget_unparent (priv->arrow_button); + priv->arrow_button = NULL; } - for (list = priv->content; list != NULL; list = list->next) - { - ToolbarContent *content = list->data; - - toolbar_content_free (content); - } - - g_list_free (priv->content); - - g_timer_destroy (priv->timer); - if (priv->menu) { g_signal_handlers_disconnect_by_func (priv->menu, menu_deactivated, toolbar); gtk_widget_destroy (GTK_WIDGET (priv->menu)); + priv->menu = NULL; } + G_OBJECT_CLASS (gtk_toolbar_parent_class)->dispose (object); +} + +static void +gtk_toolbar_finalize (GObject *object) +{ + GtkToolbar *toolbar = GTK_TOOLBAR (object); + GtkToolbarPrivate *priv = toolbar->priv; + + if (priv->sibling_path != NULL) + gtk_widget_path_unref (priv->sibling_path); + + g_list_free_full (priv->content, (GDestroyNotify)toolbar_content_free); + + g_timer_destroy (priv->timer); + if (priv->idle_id) g_source_remove (priv->idle_id); -- 2.30.2